package com.imooc.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

@Service
public class RedisService {
	
	@Autowired
	JedisPool jedisPool;
	
	
	/**
	 * Redis GET(获取单个对象)
	 * @param key
	 * @param clazz
	 * @return
	 */
	public <T> T get(KeyPrefix prefix, String key, Class<T> clazz){
		Jedis jedis = null;
		try{
			jedis = jedisPool.getResource();
			String realKey = prefix.getPrefix() + key;
			String str = jedis.get(realKey);
			
			T t = stringToBean(str, clazz);
			return t;
		}finally{
			returnToPool(jedis);
		}
	}
	
	
	/**
	 * Redis SET（设置对象）
	 * @param str
	 * @param clazz
	 * @return
	 */
	public <T> boolean set(KeyPrefix prefix, String key, T value){
		Jedis jedis = null;
		try{
			jedis = jedisPool.getResource();
			String str = beanToString(value);
			if(str == null || str.length() <= 0)return false;
			
			String realKey = prefix.getPrefix() + key;
			int seconds = prefix.expireSeconds(); // 过期时间
			if(seconds <= 0){
				jedis.set(realKey, str);
			}else{
				jedis.setex(realKey, seconds, str);
			}
			
			return true;
		}finally{
			returnToPool(jedis);
		}
	}
	
	/**
	 * 判断key是否存在
	 * @param str
	 * @param clazz
	 * @return
	 */
	public <T> boolean exsits(KeyPrefix prefix, String key){
		Jedis jedis = null;
		try{
			jedis = jedisPool.getResource();
			String realKey = prefix.getPrefix() + key;
			return jedis.exists(realKey);
		}finally{
			returnToPool(jedis);
		}
	}
	
	
	/**
	 * 删除
	 * */
	public boolean delete(KeyPrefix prefix, String key) {
		 Jedis jedis = null;
		 try {
			 jedis =  jedisPool.getResource();
			//生成真正的key
			String realKey  = prefix.getPrefix() + key;
			long ret =  jedis.del(realKey);
			return ret > 0;
		 }finally {
			  returnToPool(jedis);
		 }
	}
	
	
	/**
	 * incr（增加值）
	 * @return
	 */
	public <T> Long incr(KeyPrefix prefix, String key){
		Jedis jedis = null;
		try{
			jedis = jedisPool.getResource();
			String realKey = prefix.getPrefix() + key;
			return jedis.incr(realKey);
		}finally{
			returnToPool(jedis);
		}
	}
	
	/**
	 * decr（减少值）
	 * @return
	 */
	public <T> Long decr(KeyPrefix prefix, String key){
		Jedis jedis = null;
		try{
			jedis = jedisPool.getResource();
			String realKey = prefix.getPrefix() + key;
			return jedis.decr(realKey);
		}finally{
			returnToPool(jedis);
		}
	}
	
	
	
	
	public static <T> T stringToBean(String str, Class<T> clazz) {
		
		if(str == null || str.length() <= 0){
			return null;
		}
		
		if(clazz == int.class || clazz == Integer.class){
			return (T)Integer.valueOf(str);
		}else if(clazz == String.class){
			return (T)str;
		}else if(clazz == long.class || clazz == Long.class){
			return (T)Long.valueOf(str);
		}else{
			return JSON.toJavaObject(JSON.parseObject(str), clazz);
		}
		
	}
	
	public static <T> String beanToString(T value) {
		if(value == null)return null;
		
		Class<?> clazz = value.getClass();
		if(clazz == int.class || clazz == Integer.class){
			return "" + value;
		}else if(clazz == String.class){
			return (String)value;
		}else if(clazz == long.class || clazz == Long.class){
			return "" + clazz;
		}else{
			return JSON.toJSONString(value);
		}
		
	}

	/**
	 * 释放jedisPool
	 * @param jedis
	 */
	private void returnToPool(Jedis jedis) {
		if(jedis != null){
			jedis.close();
		}
		
	}

	
}
